package com.ryan.spring.annotation.config;

import com.ryan.spring.annotation.condition.LinuxConditional;
import com.ryan.spring.annotation.condition.WindowsConditional;
import com.ryan.spring.annotation.model.CarFactoryBean;
import com.ryan.spring.annotation.model.Color;
import com.ryan.spring.annotation.model.Person;
import com.ryan.spring.annotation.service.CommonServoice;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Service;

/**
 * Created by kaimin on 23/1/2019.
 * time : 23:09
 */
@Configuration//告诉spring容器这是一个配置类
@Import(value = {Color.class,MyImportSelector.class,MyImportBeanDefinitionRegistor.class})//导入这个组件，id默认是全类名
public class CustomConfig2 {

    /**
     * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE  启动的时候就创建对象
     * @see ConfigurableBeanFactory#SCOPE_SINGLETON  每次get的时候才会调用方法，获取对象
     * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
     * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
     */
    @Bean
//    @Scope(value = "prototype")
//    @Lazy//只有单例的时候生效
    public Person person(){
//        System.out.println("person初始化成功");
        return new Person("ruan",12);
    }

    /**
     * @Conditional 按一定的条件进行判断，满足的情况下就给容器中注入bean
     * 这是大量的在springboot底层中使用
     * @return
     */
    @Bean("bill")
    @Conditional(value = {WindowsConditional.class})//加入到容器的条件就是要符合
    public Person person01(){
        return new Person("bill gates",63);
    }

    @Bean("linux")
    @Conditional(value = {LinuxConditional.class})
    public Person person02(){
        return new Person("linus",48);
    }


    /**
     * 向容器中注册的方式：
     * 1。包扫描+主建注解（@Controller，@Service等）【自己写的】
     * 2。用@bean【第三方包】
     * 3。用@Import【快速的给容器中导入一个组件，容器就会注册这个组件】
     *    1-》@ImportSelector导入选择器，返回需要导入组件全类名数组
     *      2-》@ImportBeanDefinitionRegistrar 手动注册到容器中
     *      公3个
     * 4。利用spring的factoryBean
     *
     */
    @Profile("prod")//根据环境，容器是否要加载
    @Bean
    public CarFactoryBean carFactoryBean(){
        return new CarFactoryBean();
    }
}
